﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.IO;

using System.Data.SqlClient;
using ECOSYSTEM_Dominio;

namespace ECOSYSTEM_DAL
{
    public class ProductoDAL
    {
        SqlConnection cnn;
        Int32 CodProdIDMax;
        public Int32 guardarProducto(Producto elProducto) { 
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("RegistrarProducto",cnn);
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add("@NomProd", SqlDbType.NVarChar,100);
                cmd.Parameters.Add("@StockMin", SqlDbType.Int);
                cmd.Parameters.Add("@ImageProd", SqlDbType.Image);
                cmd.Parameters.Add("@Tipo", SqlDbType.NVarChar,30);               
                cmd.Parameters.Add("@MarcaID", SqlDbType.Int);
                cmd.Parameters.Add("@SubLineaID", SqlDbType.Int);
               
                cmd.Parameters["@NomProd"].Value = elProducto.Nombre;
                cmd.Parameters["@StockMin"].Value = elProducto.StockMin;
                cmd.Parameters["@ImageProd"].Value = elProducto.Imagen;
                cmd.Parameters["@Tipo"].Value = elProducto.Tipo;                
                cmd.Parameters["@MarcaID"].Value = elProducto.LaMarca;                
                cmd.Parameters["@SubLineaID"].Value = elProducto.LaSubLinea;
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read()) {
                    CodProdIDMax = Convert.ToInt32(dr["IDProdMax"]);
                }
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return CodProdIDMax;
        }
        public Boolean ActualizarProducto(Producto elProducto)
        {
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("ActualizarProducto", cnn);
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add("@ProductoID", SqlDbType.Int);
                cmd.Parameters.Add("@NomProd", SqlDbType.NVarChar, 100);
                cmd.Parameters.Add("@StockMin", SqlDbType.Int);
                cmd.Parameters.Add("@ImageProd", SqlDbType.Image);
                cmd.Parameters.Add("@Tipo", SqlDbType.NVarChar, 30);              
                cmd.Parameters.Add("@SubLineaID", SqlDbType.Int);
                cmd.Parameters.Add("@MarcaID", SqlDbType.Int);

                cmd.Parameters["@ProductoID"].Value = elProducto.ProductoID;
                cmd.Parameters["@NomProd"].Value = elProducto.Nombre;
                cmd.Parameters["@StockMin"].Value = elProducto.StockMin;
                cmd.Parameters["@ImageProd"].Value = elProducto.Imagen;
                cmd.Parameters["@Tipo"].Value = elProducto.Tipo;               
                cmd.Parameters["@MarcaID"].Value = elProducto.LaMarca;
                cmd.Parameters["@SubLineaID"].Value = elProducto.LaSubLinea;
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return true;
        }

        public DataTable ObtenerListaProductos(Int32 CodSubLinea, Int32 CodMarca) {
            DataTable lista = null;
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlDataAdapter da = new SqlDataAdapter("ObtenerListaProducto",cnn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.Add("@SubLineaID", SqlDbType.Int);
                da.SelectCommand.Parameters["@SubLineaID"].Value = CodSubLinea;
                da.SelectCommand.Parameters.Add("@CodMarcaID", SqlDbType.Int);
                da.SelectCommand.Parameters["@CodMarcaID"].Value = CodMarca;
                lista = new DataTable();
                da.Fill(lista);
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return lista;
        }
        public DataTable ObtenerProductosRegistrados()
        {
            DataTable lista = null;
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlDataAdapter da = new SqlDataAdapter("ObtenerProductosRegistrados", cnn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                lista = new DataTable();
                da.Fill(lista);
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return lista;
        }
        public List<Producto> BuscarDatoProducto(Int32 CodProd)
        {
            List<Producto> lista;
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("ObtenerDatosProducto", cnn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@ProductoID", SqlDbType.NVarChar, 100);
                cmd.Parameters["@ProductoID"].Value = CodProd;
                lista = new List<Producto>();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    Producto elProducto = new Producto();
                    elProducto.ProductoID = Convert.ToInt32(dr["ProductoID"]);
                    elProducto.Nombre = dr["NombreProducto"].ToString();
                    elProducto.StockMin = Convert.ToInt32(dr["StockMin"]);
                    elProducto.LaMarca = Convert.ToInt32(dr["MarcaID"]);
                    elProducto.LaSubLinea = Convert.ToInt32(dr["SubLineaID"]);
                    lista.Add(elProducto);
                }
                return lista;
            }
            catch (SqlException e) { throw new Exception(e.Message); }
            catch (Exception ex) { throw new Exception(ex.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
        }
        public List<Producto> ObtenerImagenProducto(Int32 CodProd)
        {
            List<Producto> lista;
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("ObtenerImagenProducto", cnn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("CodigoProducto", CodProd);
                lista = new List<Producto>();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    Producto elProducto = new Producto();
                    elProducto.Imagen = (byte[])(dr["ImageProd"]);                    
                    lista.Add(elProducto);
                }
                return lista;
            }
            catch (SqlException e) { throw new Exception(e.Message); }
            catch (Exception ex) { throw new Exception(ex.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
        }
        //--> SERVICIOS <--
        public Boolean guardarServicio(Producto elProducto)
        {
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("RegistrarServicio", cnn);
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add("@NomProd", SqlDbType.NVarChar, 80);
                cmd.Parameters.Add("@StockMin", SqlDbType.Float);
                cmd.Parameters.Add("@Tipo", SqlDbType.NVarChar, 30);
                cmd.Parameters.Add("@Descripcion", SqlDbType.Text);

                cmd.Parameters["@NomProd"].Value = elProducto.Nombre;
                cmd.Parameters["@StockMin"].Value = elProducto.StockMin;
                cmd.Parameters["@Tipo"].Value = elProducto.Tipo;
                cmd.Parameters["@Descripcion"].Value = elProducto.Descripcion;
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return true;
        }

        public DataTable ObtenerServicios()
        {
            DataTable lista = null;
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlDataAdapter da = new SqlDataAdapter("ObtenerServicios", cnn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                lista = new DataTable();
                da.Fill(lista);
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return lista;
        }
        
    }
}
